//---------------------1、赋值推导--------------------------
//以赋值的结果，来推到内容
let name='zh'//string
let age=20 //number
//let和const区别
const a1=20 //20如果使用常量，来推到的类型就是字面量类型
export {}

//联合类型
let name1:string|number
// name1.toLocaleString() //默认没有赋值的时候，联合类型可以调用公共方法，why？为了安全，所以只能访问公共的属性
name1='www'
name.includes('w') //赋值后，就会根据赋值推导调用的方法

//---------------------2、联合类型，一般我们会基于联合类型来扩展额外的属性---------------------
//字面量类型，type可以申明一个类型，申明的类型不是一个js对象
type Direction='up'|'down'|'right'|'left'
let direction='up'

type women=|{
    wealthy:true,
    waste:string
}
|{
    wealthy:false,
    norality:string
}
//错误
// const richWomen:women={
//     wealthy:true,
//     dd:'w'
// }

const richWomen2:women={
    wealthy:true,
    waste:'w'
}

//---------------------3、断言：可以强制把某个类断言成已经存在的类型--------------------------
//    "strict": true, 
//断言出了问题，后果自己负责，因为有可能会出现问题
let ele =document.getElementById('app')
//错误
// ele.style.background='red'
//错误
// ele?.style.background='red'//?是js语法
ele!.style.background='red' //!是ts语法，非空断言，表示这个值一定不为空，就是绕过ts检测了

//---------------------4、as--------------------------
let ele1:HTMLElement | null =document.getElementById('app');
(ele1 as HTMLElement).style.background='red';
(<HTMLElement>ele1).style.background='red'; //不推荐和js冲突

//---------------------5、双重断言：我们可以把一个值断言为any，再断言为其他类型--------------------------
let ww:string|number
//错误
// ww as boolean
// ww as any as boolean//先断言为any，在断言为其他任意类型
